/**
 * @File	FacadeBase.java
 * @Package	cn.com.ums.plat.pool
 * 
 * @Version	@Date		@Author	@Brief
 * 0.0.1	2017-05-17	Conan	新建	
 */
package com.plat.pool;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import com.plat.common.UmsConfig;
import com.ums.umsmsg.UmsMsg;
import com.ums.umsmsg.common.Log;
import com.ums.umsmsg.proc.Trans;

/**
 * @Class	FacadeBase
 * @Brief	北京银联商务应用处理
 */
public abstract class FacadeBase {
	private static Logger log = Logger.getLogger(FacadeBase.class);									//log4j日志

	protected static String MSG_DIR_CFG = UmsConfig.getProperty("msg", "cfg.dir");					//报文配置文件路径
	protected ArrayList<String> arrLogic = new ArrayList<String>();									//逻辑
	protected ApplicationContext applicationContext = null;											//应用程序
	protected Trans trans = null;																	//交易
	protected byte[] inReqMsg = null;																//请求端接收报文
	protected byte[] inRspMsg = null;																//请求端发送报文
	@SuppressWarnings({ "rawtypes", "unchecked" })
	protected Map<String, String> inMap= new HashMap();												//入字典

	public String ZD_XYM = "XYM";
	public String ZD_XYXX = "XYXX";
	
	protected String XYM_GROSS_ERROR = "96";
	protected String XYM_SYS_ERROR = "96";
	protected String XYM_UNAUTH = "58";
	protected String XYM_UNRISK = "58";
	
	public abstract boolean unpackInMsg();
	public abstract boolean packInMsg();
	public abstract boolean transAuth();
	protected abstract void setXYM();
	
	protected ArrayList<String> spePro = new ArrayList<String>();
	
	/**
	 * @Func	run
	 * @Brief	运行
	 */
	public final void run() {
		setXYM();
		spePro.addAll(arrLogic);
		int n = 0;
		for(String func : arrLogic) {
			log.info("第[" + (++n) + "]步处理开始，调用[" + func + "()]函数进行处理");
			if(!spePro.contains(func)){
				log.info("特殊流程调用[" + func + "()]函数无效、不执行");
				continue;
			}
			try {
				Method m = this.getClass().getMethod(func.trim());
				
				boolean isSucc = new Boolean(m.invoke(this).toString());
				if(!isSucc) {
					log.error("[" + func + "()]函数处理失败！");
					error(XYM_SYS_ERROR);
					return ;
				}
			} catch (SecurityException e) {
				log.error("安全警告！" + e);
				e.printStackTrace();
				break;
			} catch (NoSuchMethodException e) {
				log.error("无效的方法！" + e);
				e.printStackTrace();
				error(XYM_GROSS_ERROR);
				break;
			} catch (IllegalArgumentException e) {
				log.error("无效的参数！" + e);
				e.printStackTrace();
				error(XYM_GROSS_ERROR);
				break;
			} catch (IllegalAccessException e) {
				log.error("无效的访问！" + e);
				e.printStackTrace();
				error(XYM_GROSS_ERROR);
				break;
			} catch (InvocationTargetException e) {
				log.error("调用方法异常！" + e);
				e.printStackTrace();
				error(XYM_GROSS_ERROR);
				break;
			}
		}
	}
	
	/**
	 * @Func	start
	 * @Brief	开始
	 */
	public final boolean init() {
//		log.info("--------->TEST:" + Thread.currentThread().getName());
//		
//		txnInfo = new TTxnInfo(trans.getRecognCode());
//		txnInfo.init();
//		log.info("\n" + txnInfo.toString());
//		/* 登记队列 */
//		try {
//			if(!MonitorList.getList().add(new TTxnInfo(txnInfo))) {
//				log.warn("添加通知队列失败！");
//			}
//		} catch(Exception e) {
//			log.warn("添加通知队列失败！");
//			e.printStackTrace();
//		}
		
		return true;
	}
	
	/**
	 * @Func	start	
	 * @Brief	开始
	 */
	public final boolean start() {
//		txnInfo.start();
//		if(UmsStringUtils.isExists(trans.getCFG("SET_PUB_TXN_INFO"))) {
//			Map<String, String> tmpMap = new HashMap<String, String>();
//			UmsMsg.mapping(getCFG("SET_PUB_TXN_INFO"), inMap, tmpMap);
//			txnInfo.setData(tmpMap);
//		}
//		log.info("\n" + txnInfo.toString());
//		/* 登记队列 */
//		try {
//			if(!MonitorList.getList().add(new TTxnInfo(txnInfo))) {
//				log.warn("添加通知队列失败！");
//			}
//		} catch(Exception e) {
//			log.warn("添加通知队列失败！");
//			e.printStackTrace();
//		}
		
		return true;
	}
	
	/**
	 * @Func	finish	
	 * @Brief	完成
	 */
	public final boolean finish() {
//		txnInfo.finish();
//		if(UmsStringUtils.isExists(trans.getCFG("SET_PUB_TXN_INFO"))) {
//			Map<String, String> tmpMap = new HashMap<String, String>();
//			UmsMsg.mapping(getCFG("SET_PUB_TXN_INFO"), inMap, tmpMap);
//			txnInfo.setData(tmpMap);
//		}
//		log.info("\n" + txnInfo.toString());
//		/* 登记队列 */
//		try {
//			if(!MonitorList.getList().add(new TTxnInfo(txnInfo))) {
//				log.warn("添加通知队列失败！");
//			}
//		} catch(Exception e) {
//			log.warn("添加通知队列失败！");
//			e.printStackTrace();
//		}
		
		return true;
	}
	
	public final boolean isRish() {
		return transAuth();
	}
	
	/**
	 * @Func	finish	
	 * @Brief	结束
	 */
	public final boolean end() {
//		txnInfo.end();
//		log.info("\n" + txnInfo.toString());
//		/* 登记队列 */
//		try {
//			if(!MonitorList.getList().add(new TTxnInfo(txnInfo))) {
//				log.warn("添加通知队列失败！");
//			}
//		} catch(Exception e) {
//			log.warn("添加通知队列失败！");
//			e.printStackTrace();
//		}
		
		return true;
	}
	
	/**
	 * @Func	isTransAuth
	 * @Brief	是否拥有交易权限
	 */
	public final boolean isTransAuth() {
//		boolean isAuth = txnServer.isAuth(txnInfo);
//		if(isAuth) {
//			log.info("有[" + txnInfo.getTxnNo() + "]交易权限！");
//		} else {
//			log.error("无[" + txnInfo.getTxnNo() + "]交易权限！");
//			error(XYM_UNAUTH);
//		}
		return true;
	}
	
	/**
	 * @Func	isRiskTrans
	 * @Brief	是否风险交易
	 */
	public final boolean isTransRisk() {
		return true;
	}
	
	/**
	 * @Func	setErrMsg
	 * @Brief	设置错误码
	 */
	protected final void setErrMsg(String code) {
//		if(!inMap.containsKey(ZD_XYM) || UmsStringUtils.isNull(inMap.get(ZD_XYM))) {
//			String rspMsg = txnServer.getRspMsg(trans.getNode(Trans.IN), code);
//			setErrMsg(code, rspMsg);
//		}
	}
	
	/**
	 * @Func	setErrMsg
	 * @Brief	设置错误码、错误信息
	 */
	protected final void setErrMsg(String code, String msg) {
//		if(!inMap.containsKey(ZD_XYM) || UmsStringUtils.isNull(inMap.get(ZD_XYM))) {
//			inMap.put(ZD_XYM, code);
//		}
//		if(!inMap.containsKey(ZD_XYXX) || UmsStringUtils.isNull(inMap.get(ZD_XYXX))) {
//			inMap.put(ZD_XYXX, msg);
//		}
	}
	
	/**
	 * @Func	alterErrMsg
	 * @Brief	更新错误码、错误信息
	 */
	protected final void alterErrMsg(String code) {
//		String rspMsg = txnServer.getRspMsg(trans.getNode(Trans.IN), code);
//		alterErrMsg(code, rspMsg);
	}
	
	/**
	 * @Func	alterErrMsg
	 * @Brief	更新错误码、错误信息
	 */
	protected final void alterErrMsg(String code, String msg) {
		inMap.put(ZD_XYM, code);
		inMap.put(ZD_XYXX, msg);
	}
	
	/**
	 * @Func	error
	 * @Brief	异常处理
	 */
	private final void error(String code) {
		log.info("异常处理，调用[error()]函数进行处理");
		setErrMsg(code);
		
		inRspMsg = UmsMsg.pack(getCFG(Trans.IN), inMap);
		log.error(Log.formatHex("异常返回报文：", inRspMsg));

		log.info("异常处理，调用[finish()]函数进行处理");
		finish();
		log.info("异常处理，调用[end()]函数进行处理");
		end();
	}

	/**
	 * @Func	error
	 * @Brief	异常处理
	 */
//	private final void error(String code, String msg) {
//		log.info("异常处理，调用[error()]函数进行处理");
//		setErrMsg(code, msg);
//		
//		inRspMsg = UmsMsg.pack(getCFG(Trans.IN), inMap);
//
//		log.info("异常处理，调用[finish()]函数进行处理");
//		finish();
//		log.info("异常处理，调用[end()]函数进行处理");
//		end();
//	}

	
	public String getCFG(String type) {
		return MSG_DIR_CFG + trans.getCFG(type);
	}
	public ApplicationContext getApplicationContext() {
		return applicationContext;
	}
	public void setApplicationContext(ApplicationContext applicationContext) {
		this.applicationContext = applicationContext;
	}
	public Trans getTrans() {
		return trans;
	}
	public void setTrans(Trans trans) {
		this.trans = trans;
	}
	public byte[] getReqMessage() {
		return inReqMsg;
	}
	public void setReqMessage(byte[] message) {
		this.inReqMsg = message;
	}
	public byte[] getRspMessage() {
		return inRspMsg;
	}
	public void setRspMessage(byte[] message) {
		this.inRspMsg = message;
	}	
}
